Batch Mesh
是利用程式,根據設定自動完成mesh的功能(註1
)。
乍聽之下是個萬靈丹,全部CAD都拿來batch mesh
,是不是就可以不用建網格了。
很抱歉的是,您想要的是一個AI
版的batch mesh
,目前各家廠商可能都還在開發中?
實務上,batch mesh
適合用在簡單幾何或是每次幾何pattern都差不多的零件。
mesh
,不易發生失敗,相信不用多做解釋。batch mesh
對特徵萃取功能,來找出孔洞、凸包或折邊等特徵。由於特徵萃取是個比較複雜的主題,我們只打算用一天的篇幅來介紹batch mesh
,所以只好忍痛割捨了,或許留待明年鐵人賽再跟大家分享?
batch mesh
的設定檔為ansa_mpar
及ansa_qual
兩個檔案。ANSA會讀取這兩個檔案,並盡力做出滿足條件的網格。
ansa_mpar
是包含網格所需參數的設定檔,而ansa_mpar
是包含網格所需滿足品質的設定,兩者都可以從GUI介面產生。這裡我們分別產生surface.ansa_mpar
及surface.ansa_qual
兩個檔,並置於當前目錄。
下面的程式則分別將surface.ansa_mpar
及surface.ansa_qual
指定給surface_mpar_str
及surface_qual_str
兩個變數。
#batchmesh_surf.py
surface_mpar_str = 'surface.ansa_mpar'
surface_qual_str = 'surface.ansa_qual'
我們先利用base.Open
,讀取同一資料夾的CAD檔surface.igs
,CAD檔案內是含有一個洞的surface
。
在進行batch mesh
前,我們可以對CAD先進行幾何的修復。
首先,我們可以考慮使用base.Topo
。base.Topo
是一個裁縫師,可以將一些微小的誤差區域修補起來,成為較大塊而可以建立網格的區域。
接著,我們使用base.CheckAndFixGeometry
來真正修復幾何。base.CheckAndFixGeometry
一般需要三個參數,分別是input
、options
及fix_options
。
input
是所需修復的Entity
或Entities
,我們這邊使用base.CollectEntities
收集所有face
。
options
參考手冊共有:
UNMESHED MACROS
UNCHECKED FACES
NEEDLE FACES
COLLAPSED CONS
TRIPLE CONS
OVERLAPS
CRACKS
SINGLE CONS
SHARP EDGES
我們選了六種來使用。
fix_options
是代表要不要真的使用相對應位置的options
,1
代表要,2
代表不要。我們因為已經選好了六種,所以全都給1
(小孩子才做選擇,我們全都要)。
#batchmesh_surf.py
cad_file = 'surface.igs'
r = base.Open(cad_file)
# topo
base.Topo(cons='all')
# geometry fix
print(f'Running geometry fix...')
options = ["CRACKS",
"OVERLAPS",
"NEEDLE FACES",
"COLLAPSED CONS",
"UNCHECKED FACES",
"UNMESHED MACROS"]
options = [1, 1, 1, 1, 1, 1]
faces = base.CollectEntities(deck, None, 'FACE')
ret = base.CheckAndFixGeometry(faces, options, fix, True, True)
print(f'Geometry fixed')
Scenario
是一種container
,裡面可以添加多個Session
,每個session
可以有自己的ansa_mpar
及ansa_qual
檔。這麼一來我們可以將不同的part
甚至不同種類的幾何拆到不同的session
,透過ansa_mpar
及ansa_qual
的設定,達成更細微的控制。
這裡我們
batchmesh.GetNewMeshingScenario
建立了一個新scenario
,scenario
名為01_senario
,變數名為scenario1
。batchmesh.GetNewSession
建立了一個新session
,session
名為01_surface
,變數名為surface_sess
。batchmesh.ReadSessionMeshParams
讀取surface_mpar_str
為surface_sess
的ansa_mpar
檔。batchmesh.ReadSessionQualityCriteria
讀取surface_qual_str
為surface_sess
的ansa_qual
檔。sessions
的list
承載surface_sess
。batchmesh.AddSessionToMeshingScenario
將sessions
加入到scenario1
中。#batchmesh_surf.py
print(f'Running batch meshing...')
scenario1 = batchmesh.GetNewMeshingScenario('01_senario')
surface_sess = batchmesh.GetNewSession('01_surface')
surface_mpar = batchmesh.ReadSessionMeshParams(
surface_sess, surface_mpar_str)
surface_qual = batchmesh.ReadSessionQualityCriteria(
surface_sess, surface_qual_str)
sessions = [surface_sess]
batchmesh.AddSessionToMeshingScenario(sessions, scenario1)
這裡我們透過老朋友base.GetEntity
取得PID
為1
的Entity
,即surface.igs
內的surface
,接著透過batchmesh.AddPartToSession
將surface
加進surface_sess
。
#batchmesh_surf.py
surface = base.GetEntity(deck, LSDYNAType.PROPERTY, 1)
batchmesh.AddPartToSession(surface, surface_sess)
最後透過batchmesh.RunMeshingScenario
來執行scenario1
(註2
)。
#batchmesh_surf.py
batchmesh.RunMeshingScenario(scenario1)
可以點選下圖,觀看此script執行batch mesh
的過程。
註1:Batch Mesh
並不是ANSA的獨家武器,許多前處理也擁有類似的功能。
註2: 如果你有多個scenario
,不想一個一個執行,可以考慮使用batchmesh.RunAllMeshingScenarios
。